package com.itheima.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.mapper.EmpExprMapper;
import com.itheima.mapper.EmpMapper;
import com.itheima.pojo.*;
import com.itheima.service.EmpLogService;
import com.itheima.service.EmpService;
import com.itheima.utils.JwtUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class EmpServiceImpl implements EmpService {

    @Autowired
    private EmpMapper empMapper;
    @Autowired
    private EmpExprMapper empExprMapper;

    @Autowired
    private EmpLogService empLogService;

    /**
     * 条件分页查询
     *
     * @param empQueryParam
     * @return
     */
    @Override
    public PageResult<Emp> page(EmpQueryParam empQueryParam) {
        //使用PageHelper
        //1. 设置分页参数
        PageHelper.startPage(empQueryParam.getPage(), empQueryParam.getPageSize());
        //2. 执行查询，会被分页
        List<Emp> empList = empMapper.selectPage(empQueryParam);
        //3. 解析结果 empList 真正类型是PageHelper下的Page类型
        Page<Emp> pageInfo = (Page<Emp>) empList;
        //4. 封装到PageResult返回
        return new PageResult<>(pageInfo.getTotal(), pageInfo.getResult());
    }

    /**
     * 新增员工
     *
     * @param emp
     *
     * rollbackFor: 定义哪些异常要回滚事务
     * timeout: 超时回滚
     * propagation: 事务传播行为
     * isolation: 事务隔离级别
     */
    @Transactional(rollbackFor = Throwable.class)
    @Override
    public void add(Emp emp) throws Exception {
        //1.保存员工信息, 往员工表中插入数据
        //补全其它信息
        try {
            LocalDateTime now = LocalDateTime.now();
            emp.setCreateTime(now);
            emp.setUpdateTime(now);
            empMapper.insert(emp);
            System.out.println(emp);
            //2.保存工作经历, 先获取新增员工id,如何获取到新增员工id?
            Integer empId = emp.getId();
            //int i = 1/0;
            /*if(1==1){
                throw new Exception("我是故意的...");
            }*/
            // 是否有有工作经历,没有则不处理
            List<EmpExpr> exprList = emp.getExprList();
            //if (exprList != null && !exprList.isEmpty()) {
            if (!CollectionUtils.isEmpty(exprList)) {//比较有经验
                //有工作经历,遍历,补全empId
                /*for (EmpExpr e : exprList) {
                    e.setEmpId(empId);
                }*/
                exprList.forEach(e -> e.setEmpId(empId));
                //批量保存
                empExprMapper.insertBatch(exprList);
            }
        } finally {
            empLogService.insertLog(new EmpLog(null, LocalDateTime.now(), "新增员工"));
        }

    }

    /**
     * 删除员工
     *
     * @param ids
     */
    @Override
    @Transactional
    public void deleteByIds(List<Integer> ids) {
        //1. 批量删除员工信息
        empMapper.deleteByIds(ids);
        //2. 批量删除员工工作经历
        empExprMapper.deleteByEmpIds(ids);
        //3. 操作了2张表，添加事务控制(多表操作，操作了多条记录)
    }

    /**
     * 通过id查询员工信息
     * 使用关联查询实现
     * @param id
     * @return
     */
    @Override
    public Emp getById(Integer id) {
        //查询员工与工作经历信息
        Emp emp = empMapper.selectInfoById(id);
        return emp;
    }

    /**
     * 修改员工信息提交
     *
     * @param emp
     */
    @Transactional
    @Override
    public void updateById(Emp emp) {
        //1. 更新员工信息
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.updateById(emp);
        //2. 更新员工工作经历
        //先删除旧的关系
        List<Integer> ids = List.of(emp.getId());
        empExprMapper.deleteByEmpIds(ids);
        //再添加新关系
        List<EmpExpr> exprList = emp.getExprList();
        if (!CollectionUtils.isEmpty(exprList)) {
            exprList.forEach(e -> e.setEmpId(emp.getId()));
            empExprMapper.insertBatch(exprList);
        }
    }

    /**
     * 查询所有员工信息
     *
     * @return
     */
    @Override
    public List<Emp> listAll() {
        return empMapper.selectAll();
    }

    /**
     * 员工登录
     *
     * @param emp
     * @return
     */
    @Override
    public LoginInfo login(Emp emp) {
        // 通过用户名与密码查询员工表，只会返回一条记录
        Emp empDB = empMapper.selectByUsernameAndPassword(emp);
        // 如果没有查到数据，返回的null
        if(null != empDB){
            // 用户名与密码是正确的
            // 构建登录用户的信息返回
            LoginInfo loginInfo = new LoginInfo();
            loginInfo.setId(empDB.getId());
            loginInfo.setUsername(empDB.getUsername());
            loginInfo.setName(empDB.getName());
            // 生成token
            Map<String,Object> claims = new HashMap<>();
            claims.put("id",empDB.getId());//必须有id，后续开发的功能需要用到
            claims.put("username",empDB.getUsername());
            String token = JwtUtils.generateJwt(claims);
            loginInfo.setToken(token);
            return loginInfo;
        }
        return null;
    }

    /**
     * 通过id查询员工信息
     *
     * @param id
     * @return

    @Override
    public Emp getById(Integer id) {
        //1. 查询员工信息
        Emp emp = empMapper.selectById(id);
        //2. 查询员工工作经历
        List<EmpExpr> exprList = empExprMapper.selectByEmpId(id);
        //3. 把工作经历设置到员工对象中
        emp.setExprList(exprList);
        return emp;
    }*/

}
